package thread;

public class ThreadDemo {

    public void threadExample() throws InterruptedException {
        // 除了main线程默认以外的线程，涉及到JVM相关底层原理


        // 通过创建Thread对象来创建一个新的线程，Thread构造方法中需要传入一个Runnable接口的实现
        // （其实就是编写要在另一个线程执行的内容逻辑）
        // 同时Runnable只有一个未实现方法，因此可以直接使用lambda表达式
        Thread t1 = new Thread(() -> {
            System.out.println("我是线程1："+Thread.currentThread().getName());
            System.out.println("我正在计算 0-10000 之间所有数的和...");
            int sum = 0;
            for (int i = 0; i <= 10000; i++) {
                sum += i;
            }
            System.out.println("结果："+sum);
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50; i++) {
                System.out.println("我是二号线程："+i);
            }

        });
        t1.start();
        Thread.sleep(1000);
        // sleep方法是Thread的静态方法，它只作用于当前线程（它知道当前线程是哪个）
        t2.start();
        Thread.sleep(1000);
        System.out.println("我是主线程！");
    }

    // 线程还有一个run方法，也能执行线程里面定义的内容，但是run是直接在当前线程执行，并不是创建一个线程执行


    private static int value = 0;

    // 线程锁
    public void lockExample() throws InterruptedException {

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) value++;
            System.out.println("线程1完成");
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) value++;
            System.out.println("线程2完成");
        });
        t1.start();
        t2.start();
        Thread.sleep(1000);  //主线程停止1秒，保证两个线程执行完成
        System.out.println(value);

    }

    // 优先级:优先级越高的线程，获得CPU资源的概率会越大，并不是说一定优先级越高的线程越先执行！

    public static void main(String[] args) throws InterruptedException {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.threadExample();

        threadDemo.lockExample();
    }

}
